home *** CD-ROM | disk | FTP | other *** search
- ;*****************************************************************************
- ; INT24H.ASM Example: handing critical errors from DOS.
- ;
- ;
- ; This program will hook interrupt 24h which is the DOS critical
- ; error handler. DOS32 automatically redirect INT 24h from real mode to
- ; INT 24h in protected mode. In other words, your programs may handle
- ; DOS critical errors simply by hooking interrupt 24h.
- ; Normally the command interpreter ( e.g COMMAND.COM ) hooks this interrupt
- ; and displays a message on the screen asking the user to Abort, Ignore,
- ; Fail or Retry the operation.
- ; The protected mode critical error handler below works in a similar
- ; way except it does not allow to (A)bort since this will terminate the
- ; application without exiting from protected mode properly.
- ;
- ;*****************************************************************************
-
- .386
- .model flat
- .stack 1024
-
- .data
- Old_Int24h_vector DF ?
- return_code db ?
- dummystring db 256 dup (?)
-
-
- .code
- mesg1 db ' Please remove disk from drive A, so that the INT 24h critical error is called.'
- db 13,10,13,10,'Press any key ...',13,10,36
- exit_mesg db 'Program is exiting ',13,10,36
-
-
- start:
-
-
- ;
- ; Save the INT 24h vector before we modify it
- ;
- mov ax,204h
- mov bl,24h
- int 31h
- Mov Dword ptr Old_Int24h_vector,edx
- Mov Word ptr Old_Int24h_vector[4],cx
-
- ;
- ; Set INT 24h vector point to our critical error handler ( see below )
- ;
- mov ax,205h
- mov bl,24h
- mov cx,cs
- mov edx,Offset Int24h_Handler
- int 31h
-
-
-
- ; Display a message to let the user know the critical error handler
- ; is about to be invoked.
- ;
- mov edx,offset mesg1
- mov ah,9
- int 21h
- mov ah,0 ; wait for a key
- int 16h
-
-
- ;
- ; Access drive A just to make DOS invoke a critical error (INT 24h)
- ;
- mov ah,47h ; get CWD
- mov esi,offset dummystring
- mov dl,1
- int 21h
-
-
- ;
- ; Restore the origonal INT 24h vector
- ;
- mov ax,204h
- mov bl,24h
- Mov edx,Dword ptr Old_Int24h_vector
- Mov cx,Word ptr Old_Int24h_vector[4]
- int 31h
-
-
- ;
- ; Exit program with a message.
- ;
- mov edx,offset exit_mesg
- mov ah,9
- int 21h
- mov ax,4c00h
- int 21h
-
-
- ;************************************************************************
- ;
- ; INTERRUPT 24H --CRITICAL ERROR HANDLER--
- ;
- ;************************************************************************
- Int24h_Handler PROC FAR
- push ds ; Save registers used
- pushad
- mov ax,_DATA ; load DS with data selector
- mov ds,ax
-
- mov edx,offset Error_message
- mov ah,9
- int 21h
-
- ; Loop around to read the keyboard
- ;
-
- getkeyLOOP:
- mov ah,0 ; get bios key
- int 16h
- cmp ah,17h
- jne J09
- mov return_code,0 ; ignore
- jmp gotkey
- J09:
- cmp ah,21h
- jne J08
- mov return_code,3 ; Fail
- jmp gotkey
- J08:
- cmp ah,13h
- jne J07
- mov return_code,1 ; Try again
- jmp gotkey
- J07:
- jmp getkeyLOOP
- gotkey:
-
- popad
- mov al,return_code
- pop ds
- iretd ; Return from the interrupt.
-
- Error_message LABEL BYTE
- db 13,10
- db ' This message has been printed by the INT 24h critical error handler.',13,10
- db ' Please select one of the following actions ',13,10
- db ' F) fail',13,10
- db ' R) retry',13,10
- db ' I) ignore',13,10
- db '$'
-
- Int24h_Handler ENDP
-
- end start
-